package org.example.analysis.service.analyzer;

import lombok.extern.slf4j.Slf4j;
import org.example.analysis.service.dataobj.ClassDataObject;
import org.example.analysis.service.dataobj.MethodDataObject;

import java.util.ArrayList;
import java.util.List;

/**
 * 方法分析器
 * 负责处理方法调用关系、复杂度等分析
 */
@Slf4j
public class MethodAnalyzer {
    
    /**
     * 查找方法调用
     * @param allClasses 所有类信息
     * @param methodInfo 当前方法信息
     * @param classInfo 当前类信息
     * @return 被调用的方法列表
     */
    public List<MethodDataObject> findMethodCalls(List<ClassDataObject> allClasses, MethodDataObject methodInfo, ClassDataObject classInfo) {
        List<MethodDataObject> calledMethods = new ArrayList<>();
        try {
            // 分析方法体中的方法调用
            analyzeMethodCalls(methodInfo, classInfo, allClasses, calledMethods);
            
            // 记录日志
            log.debug("方法 {}.{} 调用了 {} 个其他方法", 
                classInfo.getClassName(), 
                methodInfo.getMethodName(), 
                calledMethods.size());
        } catch (Exception e) {
            log.error("分析方法调用失败: {}.{}", classInfo.getClassName(), methodInfo.getMethodName(), e);
        }
        return calledMethods;
    }

    /**
     * 分析方法调用
     * @param methodInfo 当前方法信息
     * @param classInfo 当前类信息
     * @param allClasses 所有类信息
     * @param calledMethods 收集被调用的方法
     */
    private void analyzeMethodCalls(MethodDataObject methodInfo, ClassDataObject classInfo, 
            List<ClassDataObject> allClasses, List<MethodDataObject> calledMethods) {
        String methodBody = methodInfo.getMethodBody();
        if (methodBody == null || methodBody.isEmpty()) {
            return;
        }

        // 遍历所有类
        for (ClassDataObject targetClass : allClasses) {
            // 跳过当前类
            if (targetClass.getClassName().equals(classInfo.getClassName())) {
                continue;
            }

            // 检查每个方法是否被调用
            for (MethodDataObject targetMethod : targetClass.getMethods()) {
                if (isMethodCalled(methodBody, targetClass, targetMethod)) {
                    calledMethods.add(targetMethod);
                }
            }
        }
    }

    /**
     * 判断方法是否被调用
     * @param methodBody 方法体
     * @param targetClass 目标类
     * @param targetMethod 目标方法
     * @return 是否被调用
     */
    private boolean isMethodCalled(String methodBody, ClassDataObject targetClass, MethodDataObject targetMethod) {
        // 1. 检查是否包含完整的方法调用（类名.方法名）
        String fullMethodCall = targetClass.getClassName() + "." + targetMethod.getMethodName();
        if (methodBody.contains(fullMethodCall)) {
            return true;
        }

        // 2. 检查是否直接调用方法（考虑已导入的类）
        String directMethodCall = targetMethod.getMethodName() + "(";
        if (methodBody.contains(directMethodCall)) {
            // TODO: 这里可以进一步完善，检查是否有对应的import语句
            return true;
        }

        return false;
    }
} 